home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / chrome / browser.jar / content / browser / search / engineManager.js next >
Text File  |  2006-09-22  |  15KB  |  453 lines

  1. //@line 39 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/search/content/engineManager.js"
  2.  
  3. const Ci = Components.interfaces;
  4. const Cc = Components.classes;
  5.  
  6. const ENGINE_FLAVOR = "text/x-moz-search-engine";
  7.  
  8. const BROWSER_SUGGEST_PREF = "browser.search.suggest.enabled";
  9.  
  10. var gEngineView = null;
  11.  
  12. var gEngineManagerDialog = {
  13.   init: function engineManager_init() {
  14.     gEngineView = new EngineView(new EngineStore());
  15.  
  16.     var prefService = Cc["@mozilla.org/preferences-service;1"].
  17.                       getService(Ci.nsIPrefBranch);
  18.     var suggestEnabled = prefService.getBoolPref(BROWSER_SUGGEST_PREF);
  19.     document.getElementById("enableSuggest").checked = suggestEnabled;
  20.  
  21.     var tree = document.getElementById("engineList");
  22.     tree.view = gEngineView;
  23.  
  24.     var os = Cc["@mozilla.org/observer-service;1"].
  25.              getService(Ci.nsIObserverService);
  26.     os.addObserver(this, "browser-search-engine-modified", false);
  27.   },
  28.  
  29.   observe: function engineManager_observe(aEngine, aTopic, aVerb) {
  30.     if (aTopic == "browser-search-engine-modified") {
  31.       aEngine.QueryInterface(Ci.nsISearchEngine)
  32.       switch (aVerb) {
  33.       case "engine-added":
  34.         gEngineView._engineStore.addEngine(aEngine);
  35.         gEngineView.rowCountChanged(gEngineView.lastIndex, 1);
  36.         break;
  37.       case "engine-changed":
  38.         gEngineView._engineStore.reloadIcons();
  39.         break;
  40.       case "engine-removed":
  41.       case "engine-current":
  42.         // Not relevant
  43.         return;
  44.       }
  45.       gEngineView.invalidate();
  46.     }
  47.   },
  48.  
  49.   onOK: function engineManager_onOK() {
  50.     // Remove the observer
  51.     var os = Cc["@mozilla.org/observer-service;1"].
  52.              getService(Ci.nsIObserverService);
  53.     os.removeObserver(this, "browser-search-engine-modified");
  54.  
  55.     // Set the preference
  56.     var newSuggestEnabled = document.getElementById("enableSuggest").checked;
  57.     var prefService = Cc["@mozilla.org/preferences-service;1"].
  58.                       getService(Ci.nsIPrefBranch);
  59.     prefService.setBoolPref(BROWSER_SUGGEST_PREF, newSuggestEnabled);
  60.  
  61.     // Commit the changes
  62.     gEngineView._engineStore.commit();
  63.   },
  64.   
  65.   onCancel: function engineManager_onCancel() {
  66.     // Remove the observer
  67.     var os = Cc["@mozilla.org/observer-service;1"].
  68.              getService(Ci.nsIObserverService);
  69.     os.removeObserver(this, "browser-search-engine-modified");
  70.   },
  71.  
  72.   onRestoreDefaults: function engineManager_onRestoreDefaults() {
  73.     var num = gEngineView._engineStore.restoreDefaultEngines();
  74.     gEngineView.rowCountChanged(0, num);
  75.     gEngineView.invalidate();
  76.   },
  77.  
  78.   showRestoreDefaults: function engineManager_showRestoreDefaults(val) {
  79.     document.documentElement.getButton("extra2").disabled = !val;
  80.   },
  81.  
  82.   loadAddEngines: function engineManager_loadAddEngines() {
  83.     this.onOK();
  84.     window.opener.BrowserSearch.loadAddEngines();
  85.     window.close();
  86.   },
  87.  
  88.   remove: function engineManager_remove() {
  89.     gEngineView._engineStore.removeEngine(gEngineView.selectedEngine);
  90.     var index = gEngineView.selectedIndex;
  91.     gEngineView.rowCountChanged(index, -1);
  92.     gEngineView.invalidate();
  93.     gEngineView.selection.select(Math.min(index, gEngineView.lastIndex));
  94.     gEngineView.ensureRowIsVisible(Math.min(index, gEngineView.lastIndex));
  95.     document.getElementById("engineList").focus();
  96.   },
  97.  
  98.   /**
  99.    * Moves the selected engine either up or down in the engine list
  100.    * @param aDir
  101.    *        -1 to move the selected engine down, +1 to move it up.
  102.    */
  103.   bump: function engineManager_move(aDir) {
  104.     var selectedEngine = gEngineView.selectedEngine;
  105.     var newIndex = gEngineView.selectedIndex - aDir;
  106.  
  107.     gEngineView._engineStore.moveEngine(selectedEngine, newIndex);
  108.  
  109.     gEngineView.invalidate();
  110.     gEngineView.selection.select(newIndex);
  111.     gEngineView.ensureRowIsVisible(newIndex);
  112.     document.getElementById("engineList").focus();
  113.   },
  114.  
  115.   onSelect: function engineManager_onSelect() {
  116.     // buttons only work if an engine is selected and it's not the last engine
  117.     var disableButtons = (gEngineView.selectedIndex == -1) ||
  118.                          (gEngineView.lastIndex == 0);
  119.     var lastSelected = (gEngineView.selectedIndex == gEngineView.lastIndex);
  120.     var firstSelected = (gEngineView.selectedIndex == 0);
  121.  
  122.     document.getElementById("cmd_remove").setAttribute("disabled",
  123.                                                        disableButtons);
  124.  
  125.     document.getElementById("cmd_moveup").setAttribute("disabled",
  126.                                             disableButtons || firstSelected);
  127.  
  128.     document.getElementById("cmd_movedown").setAttribute("disabled",
  129.                                              disableButtons || lastSelected);
  130.   }
  131. };
  132.  
  133. var gDragObserver = {
  134.   onDragStart: function (aEvent, aXferData, aDragAction) {
  135.     var selectedIndex = gEngineView.selectedIndex;
  136.     if (selectedIndex == -1)
  137.       return;
  138.  
  139.     aXferData.data = new TransferData();
  140.     aXferData.data.addDataForFlavour(ENGINE_FLAVOR, selectedIndex.toString());
  141.  
  142.     aDragAction.action = Ci.nsIDragService.DRAGDROP_ACTION_MOVE;
  143.   },
  144.   onDrop: function (aEvent, aXferData, aDragSession) { },
  145.   onDragExit: function (aEvent, aDragSession) { },
  146.   onDragOver: function (aEvent, aFlavour, aDragSession) { },
  147.   getSupportedFlavours: function() { return null; }
  148. };
  149.  
  150. // "Operation" objects
  151. function EngineMoveOp(aEngineClone, aNewIndex) {
  152.   if (!aEngineClone)
  153.     throw new Error("bad args to new EngineMoveOp!");
  154.   this._engine = aEngineClone.originalEngine;
  155.   this._newIndex = aNewIndex;
  156. }
  157. EngineMoveOp.prototype = {
  158.   _engine: null,
  159.   _newIndex: null,
  160.   commit: function EMO_commit() {
  161.     var searchService = Cc["@mozilla.org/browser/search-service;1"].
  162.                         getService(Ci.nsIBrowserSearchService);
  163.     searchService.moveEngine(this._engine, this._newIndex);
  164.   }
  165. }
  166.  
  167. function EngineRemoveOp(aEngineClone) {
  168.   if (!aEngineClone)
  169.     throw new Error("bad args to new EngineRemoveOp!");
  170.   this._engine = aEngineClone.originalEngine;
  171. }
  172. EngineRemoveOp.prototype = {
  173.   _engine: null,
  174.   commit: function ERO_commit() {
  175.     var searchService = Cc["@mozilla.org/browser/search-service;1"].
  176.                         getService(Ci.nsIBrowserSearchService);
  177.     searchService.removeEngine(this._engine);
  178.   }
  179. }
  180.  
  181. function EngineUnhideOp(aEngineClone, aNewIndex) {
  182.   if (!aEngineClone)
  183.     throw new Error("bad args to new EngineUnhideOp!");
  184.   this._engine = aEngineClone.originalEngine;
  185.   this._newIndex = aNewIndex;
  186. }
  187. EngineUnhideOp.prototype = {
  188.   _engine: null,
  189.   _newIndex: null,
  190.   commit: function EUO_commit() {
  191.     this._engine.hidden = false;
  192.     var searchService = Cc["@mozilla.org/browser/search-service;1"].
  193.                         getService(Ci.nsIBrowserSearchService);
  194.     searchService.moveEngine(this._engine, this._newIndex);
  195.   }
  196. }
  197.  
  198. function EngineStore() {
  199.   var searchService = Cc["@mozilla.org/browser/search-service;1"].
  200.                       getService(Ci.nsIBrowserSearchService);
  201.   this._engines = searchService.getVisibleEngines({}).map(this._cloneEngine);
  202.   this._defaultEngines = searchService.getDefaultEngines({}).map(this._cloneEngine);
  203.  
  204.   this._ops = [];
  205.  
  206.   // check if we need to disable the restore defaults button
  207.   var someHidden = this._defaultEngines.some(function (e) {return e.hidden;});
  208.   gEngineManagerDialog.showRestoreDefaults(someHidden);
  209. }
  210. EngineStore.prototype = {
  211.   _engines: null,
  212.   _defaultEngines: null,
  213.   _ops: null,
  214.  
  215.   get engines() {
  216.     return this._engines;
  217.   },
  218.   set engines(val) {
  219.     this._engines = val;
  220.     return val;
  221.   },
  222.  
  223.   _getIndexForEngine: function ES_getIndexForEngine(aEngine) {
  224.     return this._engines.indexOf(aEngine);
  225.   },
  226.  
  227.   _getEngineByName: function ES_getEngineByName(aName) {
  228.     for each (var engine in this._engines)
  229.       if (engine.name == aName)
  230.         return engine;
  231.   },
  232.  
  233.   _cloneEngine: function ES_cloneObj(aEngine) {
  234.     var newO=[];
  235.     for (var i in aEngine)
  236.       newO[i] = aEngine[i];
  237.     newO.originalEngine = aEngine;
  238.     return newO;
  239.   },
  240.  
  241.   // Callback for Array's some(). A thisObj must be passed to some()
  242.   _isSameEngine: function ES_isSameEngine(aEngineClone) {
  243.     return aEngineClone.originalEngine == this.originalEngine;
  244.   },
  245.  
  246.   commit: function ES_commit() {
  247.     var searchService = Cc["@mozilla.org/browser/search-service;1"].
  248.                         getService(Ci.nsIBrowserSearchService);
  249.     var currentEngine = this._cloneEngine(searchService.currentEngine);
  250.     for (var i = 0; i < this._ops.length; i++)
  251.       this._ops[i].commit();
  252.  
  253.     // Restore currentEngine if it is a default engine that is still visible.
  254.     // Needed if the user deletes currentEngine and then restores it.
  255.     if (this._defaultEngines.some(this._isSameEngine, currentEngine) &&
  256.         !currentEngine.originalEngine.hidden)
  257.       searchService.currentEngine = currentEngine.originalEngine;
  258.   },
  259.  
  260.   addEngine: function ES_addEngine(aEngine) {
  261.     this._engines.push(this._cloneEngine(aEngine));
  262.   },
  263.  
  264.   moveEngine: function ES_moveEngine(aEngine, aNewIndex) {
  265.     if (aNewIndex < 0 || aNewIndex > this._engines.length - 1)
  266.       throw new Error("ES_moveEngine: invalid aNewIndex!");
  267.     var index = this._getIndexForEngine(aEngine);
  268.     if (index == -1)
  269.       throw new Error("ES_moveEngine: invalid engine?");
  270.  
  271.     if (index == aNewIndex)
  272.       return; // nothing to do
  273.  
  274.     // Move the engine in our internal store
  275.     var removedEngine = this._engines.splice(index, 1)[0];
  276.     this._engines.splice(aNewIndex, 0, removedEngine);
  277.  
  278.     this._ops.push(new EngineMoveOp(aEngine, aNewIndex));
  279.   },
  280.  
  281.   removeEngine: function ES_removeEngine(aEngine) {
  282.     var index = this._getIndexForEngine(aEngine);
  283.     if (index == -1)
  284.       throw new Error("invalid engine?");
  285.  
  286.     this._engines.splice(index, 1);
  287.     this._ops.push(new EngineRemoveOp(aEngine));
  288.     if (this._defaultEngines.some(this._isSameEngine, aEngine))
  289.       gEngineManagerDialog.showRestoreDefaults(true);
  290.   },
  291.  
  292.   restoreDefaultEngines: function ES_restoreDefaultEngines() {
  293.     var added = 0;
  294.  
  295.     for (var i = 0; i < this._defaultEngines.length; ++i) {
  296.       var e = this._defaultEngines[i];
  297.  
  298.       // If the engine is already in the list, just move it.
  299.       if (this._engines.some(this._isSameEngine, e)) {
  300.         this.moveEngine(this._getEngineByName(e.name), i);
  301.       } else {
  302.         // Otherwise, add it back to our internal store
  303.         this._engines.splice(i, 0, e);
  304.         this._ops.push(new EngineUnhideOp(e, i));
  305.         added++;
  306.       }
  307.     }
  308.     gEngineManagerDialog.showRestoreDefaults(false);
  309.     return added;
  310.   },
  311.  
  312.   reloadIcons: function ES_reloadIcons() {
  313.     this._engines.forEach(function (e) {
  314.       e.uri = e.originalEngine.uri;
  315.     });
  316.   }
  317. }
  318.  
  319. function EngineView(aEngineStore) {
  320.   this._engineStore = aEngineStore;
  321. }
  322. EngineView.prototype = {
  323.   _engineStore: null,
  324.   tree: null,
  325.  
  326.   get lastIndex() {
  327.     return this.rowCount - 1;
  328.   },
  329.   get selectedIndex() {
  330.     var seln = this.selection;
  331.     if (seln.getRangeCount() > 0) {
  332.       var min = { };
  333.       seln.getRangeAt(0, min, { });
  334.       return min.value;
  335.     }
  336.     return -1;
  337.   },
  338.   get selectedEngine() {
  339.     return this._engineStore.engines[this.selectedIndex];
  340.   },
  341.  
  342.   // Helpers
  343.   rowCountChanged: function (index, count) {
  344.     this.tree.rowCountChanged(index, count);
  345.   },
  346.  
  347.   invalidate: function () {
  348.     this.tree.invalidate();
  349.   },
  350.  
  351.   ensureRowIsVisible: function (index) {
  352.     this.tree.ensureRowIsVisible(index);
  353.   },
  354.  
  355.   getSourceIndexFromDrag: function () {
  356.     var dragService = Cc["@mozilla.org/widget/dragservice;1"].
  357.                       getService().QueryInterface(Ci.nsIDragService);
  358.     var dragSession = dragService.getCurrentSession();
  359.     var transfer = Cc["@mozilla.org/widget/transferable;1"].
  360.                    createInstance(Ci.nsITransferable);
  361.  
  362.     transfer.addDataFlavor(ENGINE_FLAVOR);
  363.     dragSession.getData(transfer, 0);
  364.  
  365.     var dataObj = {};
  366.     var len = {};
  367.     var sourceIndex = -1;
  368.     try {
  369.       transfer.getAnyTransferData({}, dataObj, len);
  370.     } catch (ex) {}
  371.  
  372.     if (dataObj.value) {
  373.       sourceIndex = dataObj.value.QueryInterface(Ci.nsISupportsString).data;
  374.       sourceIndex = parseInt(sourceIndex.substring(0, len.value));
  375.     }
  376.  
  377.     return sourceIndex;
  378.   },
  379.  
  380.   // nsITreeView
  381.   get rowCount() {
  382.     return this._engineStore.engines.length;
  383.   },
  384.  
  385.   getImageSrc: function(index, column) {
  386.     if (column.id == "engineName" && this._engineStore.engines[index].iconURI)
  387.       return this._engineStore.engines[index].iconURI.spec;
  388.     return "";
  389.   },
  390.  
  391.   getCellText: function(index, column) {
  392.     if (column.id == "engineName")
  393.       return this._engineStore.engines[index].name;
  394.     return "";
  395.   },
  396.  
  397.   setTree: function(tree) {
  398.     this.tree = tree;
  399.   },
  400.  
  401.   canDrop: function(targetIndex, orientation) {
  402.     var sourceIndex = this.getSourceIndexFromDrag();
  403.     return (sourceIndex != -1 &&
  404.             sourceIndex != targetIndex &&
  405.             sourceIndex != (targetIndex + orientation));
  406.   },
  407.  
  408.   drop: function(dropIndex, orientation) {
  409.     var sourceIndex = this.getSourceIndexFromDrag();
  410.     var sourceEngine = this._engineStore.engines[sourceIndex];
  411.  
  412.     if (dropIndex > sourceIndex) {
  413.       if (orientation == Ci.nsITreeView.DROP_BEFORE)
  414.         dropIndex--;
  415.     } else {
  416.       if (orientation == Ci.nsITreeView.DROP_AFTER)
  417.         dropIndex++;    
  418.     }
  419.  
  420.     this._engineStore.moveEngine(sourceEngine, dropIndex);
  421.  
  422.     // Redraw, and adjust selection
  423.     this.invalidate();
  424.     this.selection.clearSelection();
  425.     this.selection.select(dropIndex);
  426.   },
  427.  
  428.   selection: null,
  429.   getRowProperties: function(index, properties) { },
  430.   getCellProperties: function(index, column, properties) { },
  431.   getColumnProperties: function(column, properties) { },
  432.   isContainer: function(index) { return false; },
  433.   isContainerOpen: function(index) { return false; },
  434.   isContainerEmpty: function(index) { return false; },
  435.   isSeparator: function(index) { return false; },
  436.   isSorted: function(index) { return false; },
  437.   getParentIndex: function(index) { return -1; },
  438.   hasNextSibling: function(parentIndex, index) { return false; },
  439.   getLevel: function(index) { return 0; },
  440.   getProgressMode: function(index, column) { },
  441.   getCellValue: function(index, column) { },
  442.   toggleOpenState: function(index) { },
  443.   cycleHeader: function(column) { },
  444.   selectionChanged: function() { },
  445.   cycleCell: function(row, column) { },
  446.   isEditable: function(index, column) { return false; },
  447.   setCellValue: function(index, column, value) { },
  448.   setCellText: function(index, column, value) { },
  449.   performAction: function(action) { },
  450.   performActionOnRow: function(action, index) { },
  451.   performActionOnCell: function(action, index, column) { }
  452. };
  453.